package jus.poc.prodcons.v5;

import java.io.PrintStream;
import jus.poc.prodcons.*;

/**
 * Le Consommateur est la structure consommatrice de ressources de notre modèle.
 *
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class Consommateur extends Acteur implements _Consommateur {

    protected int consommes;
    protected ProdCons tampon;
    protected int id;

    protected Consommateur(int type, Observateur observateur,
            int moyenneTempsDeTraitement, int deviationTempsDeTraitement)
            throws ControlException {
        super(type, observateur, moyenneTempsDeTraitement, deviationTempsDeTraitement);
        consommes = 0;
    }

    /**
     * le constructeur
     *
     * @param observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @param tampon
     * @param i Le numero du consommateur
     * @throws ControlException
     */
    public Consommateur(Observateur observateur,
            int moyenneTempsDeTraitement, int deviationTempsDeTraitement, ProdCons tampon, int i) throws ControlException {
        this(typeConsommateur, observateur, moyenneTempsDeTraitement, deviationTempsDeTraitement);
        this.tampon = tampon;
        id = i;
    }

    @Override
    public int nombreDeMessages() {
        return consommes;
    }

    @Override
    public void run() {
        while (true) {
            Aleatoire alea = new Aleatoire(moyenneTempsDeTraitement, deviationTempsDeTraitement);
            try {
                sleep(alea.next());
                int delay = alea.next();
                Message m = tampon.get(this);

                ((MessageX) m).setConso(this.toString());
                sleep(delay);
                observateur.consommationMessage(this, m, delay);

                print(System.out, m.toString());
                consommes++;
            } catch (InterruptedException e) {
            } catch (Exception e) {
            }
        }
    }

    /**
     * Imprime le message dans out
     *
     * @param out
     * @param message
     */
    private void print(PrintStream out, String message) {
        out.println(message);
    }

    @Override
    public String toString() {
        return "Conso" + id;
    }

    /**
     * Permet de declarer a l'observateur un retrait du message m par le
     * consommateur en cours
     *
     * @param m Le message retire
     * @throws InterruptedException
     * @throws ControlException
     */
    public void retraitMessage(Message m) throws InterruptedException, ControlException {
        observateur.retraitMessage(this, m);
    }
}
